均值方差優化(Mean Variance Optimization, MVO)是一種經典的投資組合管理方法,由哈里·馬科維茨(Harry Markowitz)於1952年提出,是現代投資組合理論的基石。MVO 的核心目標是在給定風險水平下最大化投資組合的預期回報,或在給定回報目標下最小化風險。具體來說,MVO 通過計算每個資產的預期回報和風險(即回報的平均值和波動性),來決定資金的最佳分配,以達到最佳的資產配置。
計算資產的預期回報和風險:基於歷史價格數據,計算每個資產的平均日收益率和波動性(風險),以及資產間的相關性。
def StockReturnsComputing(StockPrice, Rows, Columns):
StockReturn = np.zeros([Rows-1, Columns])
for j in range(Columns): # j: 資產
for i in range(Rows-1): # i: 每日價格
StockReturn[i,j] = ((StockPrice[i+1, j] - StockPrice[i,j]) / StockPrice[i,j]) * 100
return StockReturn
# 計算收益率
arReturns = StockReturnsComputing(arStockPrices, Rows, Cols)
# 計算平均收益和方差-協方差矩陣
meanReturns = np.mean(arReturns, axis=0)
covReturns = np.cov(arReturns, rowvar=False)
優化資產配置:利用 PyPortfolioOpt 庫,根據預期回報和風險,計算出各資產的最優權重,以最大化夏普比率(風險調整後的回報)。
from pypfopt.efficient_frontier import EfficientFrontier
ef_mean = EfficientFrontier(meanReturns, covReturns, weight_bounds=(0, 0.5))
raw_weights_mean = ef_mean.max_sharpe()
cleaned_weights_mean = ef_mean.clean_weights()
mvo_weights = np.array([1000000 * cleaned_weights_mean[i] for i in range(len(cleaned_weights_mean))])
建立初始投資組合:根據計算出的權重和最新的股票價格,確定每個資產的投資金額。
LastPrice = np.array([1/p for p in StockData.tail(1).to_numpy()[0]])
Initial_Portfolio = np.multiply(mvo_weights, LastPrice)
計算投資組合的總價值變化:使用交易數據計算投資組合在不同日期的總價值。
Portfolio_Assets = TradeData @ Initial_Portfolio
MVO_result = pd.DataFrame(Portfolio_Assets, columns=["Mean Var"])
在這裡MVO 被用作一個基準,與各種強化學習(DRL)策略(如 A2C、PPO 等)的表現進行比較。MVO 作為傳統的靜態資產配置方法,提供了一個簡單且透明的投資組合基準,幫助投資者理解和評估動態調整策略(如 DRL 模型)的優劣。
MVO_result
會在之後作為與DRL比較的基準:
MVO_result.index
來獲取日期,這些日期已設為資料框的索引。
dates = MVO_result.index
MVO_result['Mean Var']
來獲取對應的獲利數值。
profits = MVO_result['Mean Var']
DJIA 是美國最著名的股票市場指數之一,由30家大型美國上市公司組成,涵蓋多個主要產業。它被廣泛視為美國股市整體表現的代表,反映了經濟健康狀況和市場信心。
市場基準:DJIA 作為主要的市場指數,提供了一個標準來比較其他投資策略(如 MVO 和 DRL 模型)的表現。這有助於評估這些策略是否能夠超越市場平均水平。
代表市場趨勢:DJIA 反映了美國經濟的整體走勢,將投資策略的表現與 DJIA 比較,可以直觀了解策略在不同市場環境下的表現。
長期穩定性:DJIA 擁有悠久的歷史數據,適合用來進行回測和長期比較,提供穩定的參考點。
將 MVO 和 DJIA 作為基準,與各種 DRL 模型的獲利結果進行比較,主要目的是:
建立可靠的性能基準:利用 MVO 作為傳統且廣泛認可的投資組合管理方法,提供一個評估 DRL 模型表現的標準。
全面評估策略優劣:通過與 DJIA 的比較,不僅評估策略相對於傳統方法的優勢,還能了解其在整體市場中的表現。
驗證 DRL 模型的實用性:確保 DRL 模型在實際應用中具有競爭力,能夠提供超越傳統方法和市場基準的回報,從而為投資者提供實際的價值。
通過這樣的比較分析,教學不僅展示了 MVO 和 DRL 模型的潛力,還提供了實際的績效評估方法,幫助用戶更全面地理解和選擇適合的投資策略。
TRADE_START_DATE = '2020-07-01'
TRADE_END_DATE = '2021-10-29'
df_dji = YahooDownloader(
start_date=TRADE_START_DATE, end_date=TRADE_END_DATE, ticker_list=["dji"]
).fetch_data()
df_dji = df_dji[["date", "close"]]
fst_day = df_dji["close"][0]
dji = pd.merge(
df_dji["date"],
df_dji["close"].div(fst_day).mul(1000000),
how="outer",
left_index=True,
right_index=True,
).set_index("date")
dji會在之後用來與DRL比較獲利